package com.bank.util;

import java.util.regex.Pattern;

/**
 * 身份证号验证工具类
 */
public class IdCardValidator {
    
    // 身份证号正则表达式：18位，前17位为数字，最后一位可以是数字或X
    private static final Pattern ID_CARD_PATTERN = Pattern.compile("^\\d{17}[0-9X]$");
    
    /**
     * 验证身份证号格式
     * @param idCard 身份证号
     * @return true表示格式正确，false表示格式错误
     */
    public static boolean isValidFormat(String idCard) {
        if (idCard == null || idCard.trim().isEmpty()) {
            return false;
        }
        
        String trimmedIdCard = idCard.trim();
        
        // 检查长度是否为18位
        if (trimmedIdCard.length() != 18) {
            return false;
        }
        
        // 检查格式是否符合要求：前17位为数字，最后一位可以是数字或X
        if (!ID_CARD_PATTERN.matcher(trimmedIdCard).matches()) {
            return false;
        }
        
        return true;
    }
    
    /**
     * 验证身份证号并返回错误信息
     * @param idCard 身份证号
     * @return 错误信息，如果验证通过返回null
     */
    public static String validateIdCard(String idCard) {
        if (idCard == null || idCard.trim().isEmpty()) {
            return "身份证号不能为空";
        }
        
        String trimmedIdCard = idCard.trim();
        
        if (trimmedIdCard.length() != 18) {
            return "身份证号必须是18位";
        }
        
        // 检查前17位是否都是数字
        for (int i = 0; i < 17; i++) {
            if (!Character.isDigit(trimmedIdCard.charAt(i))) {
                return "身份证号前17位必须是数字";
            }
        }
        
        // 检查最后一位是否为数字或大写X
        char lastChar = trimmedIdCard.charAt(17);
        if (!Character.isDigit(lastChar) && lastChar != 'X') {
            return "身份证号最后一位必须是数字或大写X";
        }
        
        return null; // 验证通过
    }
} 